#include <REGF51RC.H>
#include "Scheduler.h"
#include "isr.h"
#include "pwm.h"
#include "oled.h"
#include "string.h"
#include "motor.h"
#include "mpu6050.h"
#include "encode.h"
#include "config.h"

char code info[] = "HELLO";

int main()
{
	P0 = 0xF0; // 开始初始化，停在哪就是哪坏了
	Scheduler_Init();
	P0 = 0x01;
#if USE_OLED
	OLED_Init();
	P0 = 0x02;
#endif
#if USE_PWM
	pwmInit();
	P0 = 0x03;
#endif
#if USE_MOTOR
	motorInit();
	P0 = 0x04;
#endif
#if USE_MPU
	MPU_Init();
	P0 = 0x05;
#endif
#if USE_ENCODE
	encodeInit();
	P0 = 0x06;
#endif

#if USE_OLED
	OLED_ShowString(0, 1, "SPD1:", 5);
	OLED_ShowString(0, 2, "SPD2:", 5);
	OLED_ShowString(0, 3, "AccZ:", 5);
	OLED_ShowString(0, 4, "DTet:", 5);
	OLED_ShowString(0, 5, "Tet :", 5);
	OLED_ShowString(0, 6, "OUT :", 5);
	OLED_ShowString(0, 0, info, strlen(info));
#endif

	EA = 1; // 使能总中断

	P0 = 0xFF;
	P1 = 0xFF;
	while(1)
	{
		Scheduler_Run();	// 调度器执行
	}
}


void ExInt0_Init(void)
{
	IT0 = 1;					// 下降边缘触发
	EX0 = 1;					// 使能外部中断
}

void ExInt1_Init(void)
{
	IT1 = 1;					// 下降边缘触发
	EX1 = 1;					// 使能外部中断
}

void Timer0_Init(void)		//100微秒@2 * 24.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x70;				// 设置定时初始值
	TH0 = 0xFE;				// 设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
}

void Timer1_Init(void)		//100微秒@2 * 24.000MHz
{
	TMOD &= 0x0F;			//设置定时器模式
	TMOD |= 0x10;			//设置定时器模式
	TL1 = 0x70;				// 设置定时初始值
	TH1 = 0xFE;				// 设置定时初始值
	TF1 = 0;				//清除TF1标志
	TR1 = 1;				//定时器1开始计时
	ET1 = 1;				//使能定时器1中断
}

void Timer2_Init(void)		//1毫秒@2 * 24.000MHz
{
	T2MOD = 0;				//初始化模式寄存器
	T2CON = 0;				//初始化控制寄存器
	TL2 = 0x60;				// 设置定时初始值
	TH2 = 0xF0;				// 设置定时初始值
	RCAP2L = 0x60;			// 设置定时重载值
	RCAP2H = 0xF0;			// 设置定时重载值
	TR2 = 1;				//定时器2开始计时
	ET2 = 1;				//使能定时器2中断
}
